package com.bd.scm.module.user.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bd.scm.dao.mapper.user.DtUserMapper;
import com.bd.scm.domain.dto.user.PersonnelFilesDto;
import com.bd.scm.domain.dto.user.UserDto;
import com.bd.scm.domain.dto.user.UserOfLeaveBatchDto;
import com.bd.scm.domain.models.user.DtUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 员工服务类
 * User: _Cps
 * Date: 2019.08.28 16:44
 */
public interface IDtUserService extends IService<DtUser> {

    /**
     * 获取人员（包含假期额度数据）.
     *
     * @param userOfLeaveBatchDto
     * @return
     */
    List<UserOfLeaveBatchDto> getUserInfoList(UserOfLeaveBatchDto userOfLeaveBatchDto);

    /**
     * 获取人员（结合工作日历）.
     *
     * @param userOfLeaveBatchDto
     * @return
     */
    List<UserOfLeaveBatchDto> getUserCalendarInfoList(UserOfLeaveBatchDto userOfLeaveBatchDto);

    /**
     * 根据用户ID检查是否存在
     *
     * @param userSerial
     * @return
     */
    boolean checkExistById(Long userSerial);

    /**
     * 根据身份证号码检查是否存在
     *
     * @param idCard
     * @return
     */
    boolean checkExistByIdCard(String idCard);

    /**
     * 根据身份证号码获取员工信息
     *
     * @param idCard
     * @return
     */
    DtUser getByIdCard(String idCard);

    /**
     * 查询人员
     *
     * @param personnelFilesDto
     * @return
     */
    IPage<PersonnelFilesDto> getUserList(Page<PersonnelFilesDto> page, PersonnelFilesDto personnelFilesDto);

    /**
     * 查询同步差异人员
     *
     * @param
     * @return
     */
    List<PersonnelFilesDto> getManualUserList(PersonnelFilesDto personnelFilesDto);

    /**
     * 新增
     *
     * @param personnelFilesDto,clientIp
     * @return
     */
    PersonnelFilesDto addUserInfo(PersonnelFilesDto personnelFilesDto, String clientIp);

    /**
     * 新增用于人脸
     *
     * @param personnelFilesDto,clientIp
     * @return
     */
    PersonnelFilesDto addUserInfoByFace(PersonnelFilesDto personnelFilesDto, String clientIp);

    /**
     * 修改
     *
     * @param personnelFilesDto,clientIp
     * @return
     */
    int updateUserInfo(PersonnelFilesDto personnelFilesDto, String clientIp);

    /**
     * 离职
     *
     * @param j
     * @param clientIp
     * @return
     */
    int quitUserInfo(String userSerial, String clientIp);

    /**
     * 离职
     *
     * @param j
     * @param clientIp
     * @return
     */
    int addLoanInfo(PersonnelFilesDto j, String clientIp);

    /**
     * 调动
     *
     * @param
     * @param clientIp
     * @return
     */
    String transferPerson(String beginTime, Long userSerial, String depSerialNew, String glyNo, String clientIp,
                          String gly);


    /**
     * 获取身份证号获取人员信息
     *
     * @param
     * @return 人员信息
     */
    public DtUser getUserInfoByCardId(String userId);

    /**
     * 获取人员编号.
     *
     * @param
     * @return 人员信息
     */
    public PersonnelFilesDto getUserSerialAndNo();

    /**
     * 获取账户类型.
     *
     * @param
     * @return 账户类型信息
     */
    List<PersonnelFilesDto> getacTypeList();

    /**
     * 获取民族.
     *
     * @param
     * @return 民族信息
     */
    List<PersonnelFilesDto> getNation();

    /**
     * 获取籍贯信息.
     *
     * @param
     * @return 籍贯信息
     */
    List<PersonnelFilesDto> getNative();

    /**
     * 获取籍贯信息.
     *
     * @param
     * @return 籍贯信息
     */
    List<PersonnelFilesDto> getUserType();

    /**
     * 获取考勤打卡信息.
     */
    List<PersonnelFilesDto> getkqdkLxList();

    /**
     * 就餐类型.
     */
    List<PersonnelFilesDto> getjcLxList();

    /**
     * 上传数据
     *
     * @param file 上传的Excel
     */
    public String uploadingExcel(MultipartFile file, HttpServletRequest request) throws Exception;

    /**
     * 人员同步
     *
     * @param
     */
    public String userSynchronization() throws Exception;

    /**
     * 部门同步
     *
     * @param
     */
    public String deptSynchronization() throws Exception;

    /**
     * 手动同步人员数据
     *
     * @param userNo
     * @param clientIp
     * @return
     */
    public int manualSynUserInfo(String userNo, String clientIp);

    /**
     * 根据登录人获取第一级审批人(批量、导入).
     *
     * @return
     */
    List<PersonnelFilesDto> getApproverListByBatch(String userSerial);

    /**
     * 根据登录人获取第二级审批人(批量、导入).
     *
     * @return
     */
    List<PersonnelFilesDto> getSecondListByBatch(String userSerial);

    /**
     * 根据登录人获取第一级审批人（个人）.
     *
     * @return
     */
    List<PersonnelFilesDto> getApproverList(String userSerial);

    /**
     * 根据登录人获取第二级审批人 （个人）.
     *
     * @return
     */
    List<PersonnelFilesDto> getLabourUnionApproverList(String userSerial);

    /**
     * 根据人员ID查看该人员是否在生产制造部中.
     *
     * @param userSerial
     * @return
     */
    Integer getUserCountById(String userSerial);

    /**
     * 手动同步数据
     */
    void manualSynUser();

    /**
     * 自动同步人员数据
     */
    void selfMotionSynUser();

    /**
     * 自动同步部门数据
     */
    void selfMotionSynDep();

    /**
     * 获取所属公司集合.
     *
     * @return
     */
    List<String> getUserCompany();

    /**
     * 获取员工类型集合.
     *
     * @return
     */
    List<String> getUserSnyLx();

    /**
     * 获取员工状态集合.
     *
     * @return
     */
    List<String> getUserSnyType();

    /**
     * 查询所有工作日历
     *
     * @return
     */
    List<JSONObject> findBdKqWorkCalendarList();

    /**
     * 部门人员设置工作日历
     *
     * @param personnelFilesDto
     * @return
     */
    String setUserCalendar(PersonnelFilesDto personnelFilesDto);

    /**
     * 获取职务列表.
     *
     * @return
     */
    List<String> getJobGrade();

    /**
     * 获取岗位级别列表.
     *
     * @return
     */
    List<String> getTechnologicalJob();

    /**
     * 根据微信账号是否能查询到信息
     * @param weChatId
     * @return
     */
    int fingUserWxCount(String weChatId);

    /**
     * 根据用户名跟密码获取用户信息
     * @param account 工号
     * @param psw 密码
     * @param systemType
     * @param weChatId 微信账号
     * @return
     */
    JSONObject getwXUserByAccountAndPsw(String account, String psw,String systemType,String weChatId,HttpServletRequest request);

    /**
     * 根据企业微信账号获取人员信息
     * @param weChatId 微信账号
     * @return
     */
    JSONObject getUserByWeChatId(String weChatId,HttpServletRequest request);

    /**
     * 根据人员ID查询人员信息
     * @param userId
     * @param request
     * @return
     */
    JSONObject getUserByUserId(String userId,HttpServletRequest request);

    /**
     * 根据人员id获取该人员部门下的审批人，即为二级审批人
     * @param userSerial
     * @return
     */
    List<String> getDeptCustByUserId(Long userSerial);

    /**
     * 根据人员ID修改人员表中人脸信息，有2  无0
     * * @param userSerial
     */
    void updateUserFaceById(Long userSerial,Integer faceState);

    /**
     * 添加人脸日志记录
     * @param object
     */
    void insertBdFaceUploadLog(JSONObject object);

    /**
     * 更新人脸上传日期
     * @param object
     */
    void updateUserRlDate(JSONObject object);
}
